﻿#pragma once
#ifndef WRWORKSERVICE_H
#define WRWORKSERVICE_H

#include "WRWorkObject.h"
#include "Structs/WRWorkStatus.h"
#include "Structs/WRWorkSwitch.h"
#include "../WRSoft-Utility/Framing/WRStateHandlers.h"

//表示工作服务对象。
class WRSOFT_WORKING_COMMON_CLASS WRWorkService : public WRWorkObject
{
public:
    //获取当前工作设备类型。
    WRType* type(void) const;

    //查询指定标识的任务处理者。
    WRTaskDealer* queryTaskDealer(const QUuid& uuid);
    //查询指示标识的状态源接口。
    WRStateSource* queryStateSource(const QUuid& uuid);

    //启动服务，如果成功，则返回0。
    virtual WR32s start(void) = 0;
    //停止服务。
    virtual void stop(void) = 0;

private:
    //执行切换处理。
    inline WR32s doSwitch(WRWorkSwitch& task)
    {
        WRWorkSwitch::Action action = task.action();
        switch(action)
        {
            case WRWorkSwitch::Start:
                return start();
            case WRWorkSwitch::Stop:
                stop();
                return WRErrors::None;
            default:
                return WRErrors::ArgumentOutOfRange;
        }
    }

    //表示状态处理器集合。
    class StatusHandlers : public WRStateHandlers<WRWorkStatus>
    {
    public:
        //初始化状态处理器。
        inline StatusHandlers(void)
            : WRStateHandlers<WRWorkStatus>(WRWorkStatus::Stopped)
        {
            //add code here
        }
    };
    //表示切换处理者类。
    WRTASKDEALER(SwitchDealer, WRWorkSwitch, WRWorkService, doSwitch)

    //切换处理者。
    SwitchDealer m_switchDealer;
    //状态处理器集合。
    StatusHandlers m_statusHandlers;

    //禁用复制构造函数和赋值操作符。
    Q_DISABLE_COPY(WRWorkService)

protected:
    //当状态改变后调用此方法。
    inline void onStatusChanged(WRWorkStatus value)
    {
        m_statusHandlers.doProcess(value);
    }

    //初始化工作服务。
    WRWorkService(const WRWorkInformation& info, WRWorkDaemon* daemon);
    //清理当前服务所占用的相关资源。
    virtual ~WRWorkService();

    //获取服务的当前状态。
    inline WRWorkStatus status(void) const
    {
        return m_statusHandlers.value();
    }

public:
    //获取切换处理者。
    inline WRTaskDealer* switchDealer(void)
    {
        return &m_switchDealer;
    }
    //获取状态源。
    inline WRStateSource* statusSource(void)
    {
        return &m_statusHandlers;
    }
};

#endif // WRWORKSERVICE_H
